package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.datepicker.client.DateBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_BuscarDefinirListaMateriales extends Composite {

	private String tituloTab;

	private static final int CHECK = 0;
	private static final int COL_CODIGO = 1;
	private static final int COL_NOMBRE = 2;
	private static final int COL_PLANO = 3;
	private static final int COL_ULTIMA_VERSION = 4;
	private static final int COL_ESTADO_LISTA_MATERIALES = 5;
	private static final int COL_MAS_INFO = 6;
	
	TabPanel padre;

	private IngenieriaServiceAsync ingenieriaService;
	
	TextBox nroOrdenPedidoTB;
	DateBox fechaPrevistaEntregaDB;
	TextArea observacionTA;
	
	boolean componentesCargados;
	RadioButton equipoRB;
	RadioButton componenteRB;
	ListBox claseEquipoCombo;
	ListBox subclaseEquipoCombo;
	ListBox planoEquipoCombo;
	ListBox claseEquipoComponenteCombo;
	ListBox subclaseEquipoComponenteCombo;
	ListBox componenteCombo;
	ListBox planoComponenteCombo;
	
	FlexTable equiposOComponentesPatronFT;
	
	Button buscarBtn;

	List<EquipoPatronDTO> equiposPatronDTO;
	List<ComponentePatronDTO> componentesPatronDTO;
	
	public P_BuscarDefinirListaMateriales(TabPanel padre, String titulo) {

		this.tituloTab = titulo;
		this.padre = padre;
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "615px");
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		//BÚSQUEDA SIN CRITERIOS
		ingenieriaService.buscarEquiposPatronUltimaVersion(-1, -1, new AsyncCallback<List<EquipoPatronDTO>>() {
			public void onSuccess(List<EquipoPatronDTO> result) {
				equiposPatronDTO = result;
				
				cargarEquipos(equiposPatronDTO);
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		//BÚSQUEDA SIN CRITERIOS
		ingenieriaService.buscarComponentesPatronUltimaVersionActivos(new AsyncCallback<List<ComponentePatronDTO>>() {
			public void onSuccess(List<ComponentePatronDTO> result) {
				componentesPatronDTO = result;
				
				cargarComponentes(componentesPatronDTO);
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		
		Label equiposYComponentesLabel = new Label("BUSCAR EQUIPOS O COMPONENTES POR");
		equiposYComponentesLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposYComponentesLabel);
		layoutPanel.setWidgetLeftWidth(equiposYComponentesLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposYComponentesLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		equipoRB = new RadioButton("equipo o componente", "EQUIPO");
		layoutPanel.add(equipoRB);
		layoutPanel.setWidgetLeftWidth(equipoRB, 5.0, Unit.PCT, 74.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(equipoRB, 70.0, Unit.PX, 20.0, Unit.PX);
		
		componenteRB = new RadioButton("equipo o componente", "COMPONENTE");
		layoutPanel.add(componenteRB);
		layoutPanel.setWidgetLeftWidth(componenteRB, 50.0, Unit.PCT, 120.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(componenteRB, 70.0, Unit.PX, 20.0, Unit.PX);
		
		AbsolutePanel equipoAP = new AbsolutePanel();
		equipoAP.setStyleName("panelConBorde");
		layoutPanel.add(equipoAP);
		layoutPanel.setWidgetLeftWidth(equipoAP, 5.0, Unit.PCT, 40.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equipoAP, 100.0, Unit.PX, 100.0, Unit.PX);
		
		Label claseEquipoLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoLabel.setStyleName("gwt-LabelFormulario");
		claseEquipoLabel.setHeight("19");
		equipoAP.add(claseEquipoLabel, 10, 20);
		
		Label subclaseEquipoLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoLabel.setStyleName("gwt-LabelFormulario");
		subclaseEquipoLabel.setHeight("19");
		equipoAP.add(subclaseEquipoLabel, 10, 65);
		
		claseEquipoCombo = new ListBox();
		equipoAP.add(claseEquipoCombo, 163, 15);
		claseEquipoCombo.setSize("125px", "28");
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboSubclaseEquipo();
			}
		});
		
		subclaseEquipoCombo = new ListBox();
		equipoAP.add(subclaseEquipoCombo, 163, 60);
		subclaseEquipoCombo.setSize("125px", "28");
		
		//Si se cambia la subclase de equipo seleccionada, listamos los planos correspondientes.
		subclaseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboPlanoEquipo();
			}
		});
		
		Label planoEquipoLabel = new Label("PLANO:");
		planoEquipoLabel.setStyleName("gwt-LabelFormulario");
		planoEquipoLabel.setHeight("19");
		equipoAP.add(planoEquipoLabel, 300, 65);
		
		planoEquipoCombo = new ListBox();
		equipoAP.add(planoEquipoCombo, 363, 60);
		planoEquipoCombo.setSize("90px", "28");
		
		AbsolutePanel componenteAP = new AbsolutePanel();
		componenteAP.setStyleName("panelConBorde");
		layoutPanel.add(componenteAP);
		layoutPanel.setWidgetLeftWidth(componenteAP, 50.0, Unit.PCT, 45.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteAP, 100.0, Unit.PX, 100.0, Unit.PX);
		
		Label claseEquipoComponenteLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		claseEquipoComponenteLabel.setHeight("19");
		componenteAP.add(claseEquipoComponenteLabel, 10, 20);
		
		Label subclaseEquipoComponenteLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		subclaseEquipoComponenteLabel.setHeight("19");
		componenteAP.add(subclaseEquipoComponenteLabel, 10, 65);
		
		Label componenteLabel = new Label("COMPONENTE:");
		componenteLabel.setStyleName("gwt-LabelFormulario");
		claseEquipoLabel.setHeight("19");
		componenteAP.add(componenteLabel, 300, 20);
		
		claseEquipoComponenteCombo = new ListBox();
		componenteAP.add(claseEquipoComponenteCombo, 163, 15);
		claseEquipoComponenteCombo.setSize("125px", "28");
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboSubclaseEquipoComponente();	
			}
		});
		
		subclaseEquipoComponenteCombo = new ListBox();
		componenteAP.add(subclaseEquipoComponenteCombo, 163, 60);
		subclaseEquipoComponenteCombo.setSize("125px", "28");
		
		//Si se cambia la subclase de equipo seleccionada, listamos los planos correspondientes.
		subclaseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboComponente();              
			}
		});
		
		componenteCombo = new ListBox();
		componenteAP.add(componenteCombo, 400, 15);
		componenteCombo.setSize("125px", "28");
		
		//Si se cambia el componente seleccionado, listamos los planos correspondientes.
		componenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboPlanoComponente();              
			}
		});
		
		Label planoComponente = new Label("PLANO:");
		planoComponente.setStyleName("gwt-LabelFormulario");
		componenteAP.add(planoComponente, 300, 65);
		
		planoComponenteCombo = new ListBox();
		componenteAP.add(planoComponenteCombo, 400, 60);
		planoComponenteCombo.setSize("90px", "28");
		
		equipoRB.setValue(true);
		claseEquipoComponenteCombo.setEnabled(false);
		subclaseEquipoComponenteCombo.setEnabled(false);
		componenteCombo.setEnabled(false);
		planoComponenteCombo.setEnabled(false);
		claseEquipoCombo.setEnabled(true);
		subclaseEquipoCombo.setEnabled(true);
		planoEquipoCombo.setEnabled(true);
		
		equipoRB.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				claseEquipoComponenteCombo.setEnabled(false);
				subclaseEquipoComponenteCombo.setEnabled(false);
				componenteCombo.setEnabled(false);
				planoComponenteCombo.setEnabled(false);
				claseEquipoCombo.setEnabled(true);
				subclaseEquipoCombo.setEnabled(true);
				planoEquipoCombo.setEnabled(true);
			}
		});
		
		componenteRB.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				
				//Cargamos componenteCombo con todos los componentes patron que existen, si no fueron cargados anteriormente.
				if(!componentesCargados) {
					cargarComboClaseEquipoComponente();
					componentesCargados = true;
				}
				claseEquipoComponenteCombo.setEnabled(true);
				subclaseEquipoComponenteCombo.setEnabled(true);
				componenteCombo.setEnabled(true);
				planoComponenteCombo.setEnabled(true);
				claseEquipoCombo.setEnabled(false);
				subclaseEquipoCombo.setEnabled(false);
				planoEquipoCombo.setEnabled(false);
			}
		});
		
		buscarBtn = new Button("BUSCAR");
		layoutPanel.add(buscarBtn);
		layoutPanel.setWidgetLeftWidth(buscarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(buscarBtn, 225.0, Unit.PX, 28.0, Unit.PX);
		
		buscarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				buscar();
			}
		});
		
		//Sección tabla de equipos o componentes patrón.
		Label equiposOComponentesPatronLabel = new Label("EQUIPOS O COMPONENTE PATRÓN");
		equiposOComponentesPatronLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposOComponentesPatronLabel);
		layoutPanel.setWidgetLeftWidth(equiposOComponentesPatronLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposOComponentesPatronLabel, 255.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel equiposOComponentesPatronSP = new ScrollPanel();
		equiposOComponentesPatronSP.setStyleName("tabla");
		layoutPanel.add(equiposOComponentesPatronSP);
		layoutPanel.setWidgetLeftWidth(equiposOComponentesPatronSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposOComponentesPatronSP, 320.0, Unit.PX, 200.0, Unit.PX);
		
		equiposOComponentesPatronFT = new FlexTable();
		equiposOComponentesPatronSP.setWidget(equiposOComponentesPatronFT);
		equiposOComponentesPatronFT.setSize("100%", "100%");
		
		//Encabezado de la tabla.
		equiposOComponentesPatronFT.setText(0, CHECK, "");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, CHECK, "4%");
		equiposOComponentesPatronFT.setText(0, COL_CODIGO, "CÓDIGO");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_CODIGO, "15%");
		equiposOComponentesPatronFT.setText(0, COL_NOMBRE, "NOMBRE");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_NOMBRE, "36%");
		equiposOComponentesPatronFT.setText(0, COL_PLANO, "PLANO");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_PLANO, "10%");
		equiposOComponentesPatronFT.setText(0, COL_ULTIMA_VERSION, "ÚLTIMA VERSIÓN");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_ULTIMA_VERSION, "10%");
		equiposOComponentesPatronFT.setText(0, COL_ESTADO_LISTA_MATERIALES, "ESTADO LISTA MATERIALES");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_ESTADO_LISTA_MATERIALES, "15%");
		equiposOComponentesPatronFT.setText(0, COL_MAS_INFO, "MÁS INFO");
		equiposOComponentesPatronFT.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		equiposOComponentesPatronFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 520.0, Unit.PX, 50.0, Unit.PX);
			
		Button salirBtn = new Button("SALIR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetLeftWidth(salirBtn, 85.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(salirBtn, 580.0, Unit.PX, 28.0, Unit.PX);
		
		Button definirBtn = new Button("DEFINIR");
		layoutPanel.add(definirBtn);
		layoutPanel.setWidgetLeftWidth(definirBtn, 70.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(definirBtn, 580.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir(event);
			}
		});
		
		definirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				String codigo = equipoOComponenteSeleccionado();
				if (codigo.equals("-1"))
					Window.alert("Seleccione un equipo o componente.");
				else	
					definirListaMateriales(codigo);
			}
		});
		
		//Creación de las listas a utilizar.
		equiposPatronDTO = new LinkedList<EquipoPatronDTO>();
		componentesPatronDTO = new LinkedList<ComponentePatronDTO>();
		
		//Cargamos claseEquipoCombo con todas las clases de equipos patron que existen.
		cargarComboClaseEquipo();
		
		componentesCargados = false;
	}
	
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo con todas las clases existentes.
	 */
	private void cargarComboClaseEquipo() {
		
		claseEquipoCombo.clear();
		claseEquipoCombo.addItem("TODAS");
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipo();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipo() {
		
		subclaseEquipoCombo.clear();
		subclaseEquipoCombo.addItem("TODAS");
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS")) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los planos pertenecientes a una clase y subclase de equipo particular.
					cargarComboPlanoEquipo();
				}
			});
		}
		else {
			planoEquipoCombo.clear();
			planoEquipoCombo.addItem("TODOS");	
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un equipo particular.
	 */
	private void cargarComboPlanoEquipo() {
		
		planoEquipoCombo.clear();
		planoEquipoCombo.addItem("TODOS");
		
		if(!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS")) {
			
			buscarBtn.setEnabled(true);
		
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
					
			ingenieriaService.buscarPlanosEquipoPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<EquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<EquipoPatronDTO> result) {
					
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(EquipoPatronDTO equipoPatronDTO : result)
						planoEquipoCombo.addItem(Validaciones.rellenarCodigo(equipoPatronDTO.getPlano()));
				}
			});
		}
	}
	
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboClaseEquipoComponente() {
		
		claseEquipoComponenteCombo.clear();
		claseEquipoComponenteCombo.addItem("TODAS");
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipoComponente();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipoComponente() {
		
		subclaseEquipoComponenteCombo.clear();
		subclaseEquipoComponenteCombo.addItem("TODAS");
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(!claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).equals("TODAS")) {
			
			buscarBtn.setEnabled(true);
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes para un componente, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los componentes pertenecientes a una clase y subclase de equipo particular.
					cargarComboComponente();
				}
			});
		}
		else {
			componenteCombo.clear();
			componenteCombo.addItem("TODOS");
			planoComponenteCombo.clear();
			planoComponenteCombo.addItem("TODOS");
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los componentes existentes.
	 */
	private void cargarComboComponente() {
		
		componenteCombo.clear();
		componenteCombo.addItem("TODOS");
		
		//Si no existe ninguna subclase de equipo cargada, que no busque componentes.
		if(!subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).equals("TODAS")) {
			
			buscarBtn.setEnabled(true);

			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarComponentesPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
				
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {

					//Cargamos el comboBox con los componentes patron existentes, mostrando código y nombre .
					for(ComponentePatronDTO componentePatronDTO : result) {
						componenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getCodigoComponente()) + Validaciones.rellenarCodigo(componentePatronDTO.getCodigoSubcomponente()) + " - " + componentePatronDTO.getNombre());
					}
	
					//Cargamos el comboBox con los planos pertenecientes a un componente particular.
					cargarComboPlanoComponente();
				}
			});
		}
		else {
			planoComponenteCombo.clear();
			planoComponenteCombo.addItem("TODOS");
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un componente particular.
	 */
	private void cargarComboPlanoComponente() {
		
		planoComponenteCombo.clear();
		planoComponenteCombo.addItem("TODOS");
		
		if(!componenteCombo.getItemText(componenteCombo.getSelectedIndex()).equals("TODOS")) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoComponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(0, 2)));
			int codigoSubcomponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(2, 4)));
			
			buscarBtn.setEnabled(true);
					
			ingenieriaService.buscarPlanosComponentePatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, codigoComponente, codigoSubcomponente, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
					
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(ComponentePatronDTO componentePatronDTO : result)
						planoComponenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getPlano()));
				}
			});
		}
	}
	
	/**
	 * Método que permite realizar el filtrado y buscar los equipos o componentes que decida el usuario.
	 */	
	protected void buscar() {
		
		int cantidadFilas = equiposOComponentesPatronFT.getRowCount();
		
		for (int i = 1; i < cantidadFilas; i++) {
			equiposOComponentesPatronFT.removeRow(1);
		}
		
		if(equipoRB.getValue()) {
			
			LinkedList<EquipoPatronDTO> equiposPatronDTOBuscados = new LinkedList<EquipoPatronDTO>();			
			
			//Si no se buscan todas las clases...
			if (!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS")) {
				
				int claseBuscada = Integer.parseInt(claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
				
				//Si no se buscan todas las subclases...
				if (!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS")) {
					
					int subclaseBuscada = Integer.parseInt(subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
					
					if (!planoEquipoCombo.getItemText(planoEquipoCombo.getSelectedIndex()).equals("TODOS")) {
					
						int planoBuscado = Integer.parseInt(planoEquipoCombo.getItemText(planoEquipoCombo.getSelectedIndex()).split(" - ")[0]);
						
						for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
							
							if((equipoPatronDTO.getCodigoClase() == claseBuscada) && (equipoPatronDTO.getCodigoSubclase() == subclaseBuscada) && 
									(equipoPatronDTO.getPlano() == planoBuscado))
								equiposPatronDTOBuscados.add(equipoPatronDTO);	
						}	
					}
					
					//Si se buscan todos los planos...
					else {
						for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
							
							if((equipoPatronDTO.getCodigoClase() == claseBuscada) && (equipoPatronDTO.getCodigoSubclase() == subclaseBuscada))
								equiposPatronDTOBuscados.add(equipoPatronDTO);	
						}	
					}
				}

				//Si se buscan todas las subclases...
				else {
					for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
						
						if(equipoPatronDTO.getCodigoClase() == claseBuscada)
							equiposPatronDTOBuscados.add(equipoPatronDTO);	
					}	
				}
			}
			
			//Si se buscan todas las clases...
			else {
				for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
					equiposPatronDTOBuscados.add(equipoPatronDTO);	
				}	
			}
			
			cargarEquipos(equiposPatronDTOBuscados);
		}
		
		else if (componenteRB.getValue()) {
			LinkedList<ComponentePatronDTO> componentesPatronDTOBuscados = new LinkedList<ComponentePatronDTO>();			
			
			//Si no se buscan todas las clases...
			if (!claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).equals("TODAS")) {
				
				int claseBuscada = Integer.parseInt(claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - ")[0]);
				
				//Si no se buscan todas las subclases...
				if (!subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).equals("TODAS")) {
					
					int subclaseBuscada = Integer.parseInt(subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - ")[0]);
					
					//Si no se buscan todos los componentes...
					if (!componenteCombo.getItemText(componenteCombo.getSelectedIndex()).equals("TODOS")) {
						
						int componenteBuscado = Integer.parseInt(componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(0, 2));
						int subcomponenteBuscado = Integer.parseInt(componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(2, 4));
						
						if (!planoComponenteCombo.getItemText(planoComponenteCombo.getSelectedIndex()).equals("TODOS")) {
						
							int planoBuscado = Integer.parseInt(planoComponenteCombo.getItemText(planoComponenteCombo.getSelectedIndex()).split(" - ")[0]);
							
							for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
								
								if((componentePatronDTO.getCodigoClase() == claseBuscada) && (componentePatronDTO.getCodigoSubclase() == subclaseBuscada) &&
										(componentePatronDTO.getCodigoComponente() == componenteBuscado) && (componentePatronDTO.getCodigoSubcomponente() == subcomponenteBuscado) &&
										(componentePatronDTO.getPlano() == planoBuscado))
									componentesPatronDTOBuscados.add(componentePatronDTO);
							}	
						}					
						
						//Si se buscan todos los planos...
						else {
							for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
								
								if((componentePatronDTO.getCodigoClase() == claseBuscada) && (componentePatronDTO.getCodigoSubclase() == subclaseBuscada) &&
										(componentePatronDTO.getCodigoComponente() == componenteBuscado) && (componentePatronDTO.getCodigoSubcomponente() == subcomponenteBuscado))
									componentesPatronDTOBuscados.add(componentePatronDTO);
							}	
						}
					}				
					
					//Si se buscan todos lo componentes...
					else {
						for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
							
							if((componentePatronDTO.getCodigoClase() == claseBuscada) && (componentePatronDTO.getCodigoSubclase() == subclaseBuscada))
								componentesPatronDTOBuscados.add(componentePatronDTO);	
						}	
					}
				}

				//Si se buscan todas las subclases...
				else {
					for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
						
						if(componentePatronDTO.getCodigoClase() == claseBuscada)
							componentesPatronDTOBuscados.add(componentePatronDTO);	
					}	
				}
			}
			
			//Si se buscan todas las clases...
			else {
				for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
					componentesPatronDTOBuscados.add(componentePatronDTO);	
				}	
			}
			
			cargarComponentes(componentesPatronDTOBuscados);
		}		
	}
	
	/**
	 * Método que carga todos los equipos en la tabla.
	 */
	private void cargarEquipos(List<EquipoPatronDTO> equiposPatronDTOACargar) {
		
		for (int i = 0; i < equiposPatronDTOACargar.size(); i++) {
			
			int cantidadFilas = equiposOComponentesPatronFT.getRowCount();
			
			Label info = new Label("");
			info.setSize("16px", "16px");
			info.setStyleName("labelInfo");
			
			RadioButton radioButton = new RadioButton("Equipo o componente seleccionado","");
			
			equiposOComponentesPatronFT.setWidget(cantidadFilas, CHECK, radioButton);
			equiposOComponentesPatronFT.getFlexCellFormatter().setHorizontalAlignment(cantidadFilas, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_CODIGO, new Label(Validaciones.rellenarCodigoEquipoPatron(equiposPatronDTOACargar.get(i))));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_CODIGO, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_NOMBRE, new Label(equiposPatronDTOACargar.get(i).getNombreClase() + " - " + equiposPatronDTOACargar.get(i).getNombreSubclase()));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_NOMBRE, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_PLANO, new Label(String.valueOf(equiposPatronDTOACargar.get(i).getPlano())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_PLANO, false);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_ULTIMA_VERSION, new Label(String.valueOf(equiposPatronDTOACargar.get(i).getNroVersion())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_ULTIMA_VERSION, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_ESTADO_LISTA_MATERIALES, new Label(String.valueOf(equiposPatronDTOACargar.get(i).getEstadoListaMateriales())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_ESTADO_LISTA_MATERIALES, true);			
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_MAS_INFO, info);
			equiposOComponentesPatronFT.getFlexCellFormatter().setHorizontalAlignment(cantidadFilas, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
			equiposOComponentesPatronFT.getRowFormatter().setStyleName(cantidadFilas, "tablaRenglon");
		
			info.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					Cell celda = equiposOComponentesPatronFT.getCellForEvent(event);
					masInformacion(celda);
				}
			});
		}
	}
	
	/**
	 * Método que carga todos los componentes en la tabla.
	 */
	private void cargarComponentes(List<ComponentePatronDTO> componentesPatronDTOACargar) {
		
		for (int i = 0; i < componentesPatronDTOACargar.size(); i++) {
			
			int cantidadFilas = equiposOComponentesPatronFT.getRowCount();
			
			Label info = new Label("");
			info.setSize("16px", "16px");
			info.setStyleName("labelInfo");
			
			RadioButton radioButton = new RadioButton("Equipo o componente seleccionado","");
			
			equiposOComponentesPatronFT.setWidget(cantidadFilas, CHECK, radioButton);
			equiposOComponentesPatronFT.getFlexCellFormatter().setHorizontalAlignment(cantidadFilas, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_CODIGO, new Label(Validaciones.rellenarCodigoComponentePatron(componentesPatronDTOACargar.get(i))));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_CODIGO, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_NOMBRE, new Label(componentesPatronDTOACargar.get(i).getNombre()));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_NOMBRE, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_PLANO, new Label(String.valueOf(componentesPatronDTOACargar.get(i).getPlano())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_PLANO, false);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_ULTIMA_VERSION, new Label(String.valueOf(componentesPatronDTOACargar.get(i).getNroVersion())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_ULTIMA_VERSION, true);
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_ESTADO_LISTA_MATERIALES, new Label(String.valueOf(componentesPatronDTOACargar.get(i).getEstadoListaMateriales())));
			equiposOComponentesPatronFT.getCellFormatter().setWordWrap(cantidadFilas, COL_ESTADO_LISTA_MATERIALES, true);			
			equiposOComponentesPatronFT.setWidget(cantidadFilas, COL_MAS_INFO, info);
			equiposOComponentesPatronFT.getFlexCellFormatter().setHorizontalAlignment(cantidadFilas, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
			equiposOComponentesPatronFT.getRowFormatter().setStyleName(cantidadFilas, "tablaRenglon");
			
			info.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					Cell celda = equiposOComponentesPatronFT.getCellForEvent(event);
					masInformacion(celda);
				}
			});
		}
	}	
	
	
	private void masInformacion(Cell celda) {	
		
		String codigo = equiposOComponentesPatronFT.getText(celda.getRowIndex(), COL_CODIGO);
		
		final P_DetalleListaMateriales popUp = new P_DetalleListaMateriales(codigo);
		popUp.setGlassEnabled(true);
		popUp.center();
		popUp.show();
	}
	
	
	public String equipoOComponenteSeleccionado() {
		String equipoOComponenteSeleccionado = "-1";

		for(int i=1; i< equiposOComponentesPatronFT.getRowCount(); i++){
			RadioButton radiobutton = (RadioButton) equiposOComponentesPatronFT.getWidget(i, CHECK);
			
			if(radiobutton.getValue() == true)
				equipoOComponenteSeleccionado = equiposOComponentesPatronFT.getText(i, 1);
		}
		
		return equipoOComponenteSeleccionado;
	}

	
	public void definirListaMateriales(String codigoEquipoOComponente) {
		
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		P_DefinirListaMateriales p_definirListaMateriales = new P_DefinirListaMateriales(padre,tituloTab, codigoEquipoOComponente);
		
		padre.clear();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(p_definirListaMateriales);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++)
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
	}
	
	public void salir(ClickEvent event) {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
